package main

import (
	"bytes"
	"fmt"
)

func test1() {
	//声明一个bytes.Buffer类型的变量buffer1
	var buffer1 bytes.Buffer
	//写入一个字符串
	buffer1.WriteString("hello")
	//Buffer值的长度是未读内容的长度，而不是已存内容的总长度
	//Cap方法提供的是内容容器的容量，不是内容长度。
	fmt.Printf("%d,%d\n", buffer1.Len(), buffer1.Cap()) //5,64

	//从buffer1中读取一部分内容，并填满长度为7的字节切片p1
	p1 := make([]byte, 7)
	fmt.Println(p1) //[0 0 0 0 0 0 0]
	n, _ := buffer1.Read(p1)
	fmt.Printf("%d,%d,%d\n", n, buffer1.Len(), buffer1.Cap()) //5,0,64
}
func test2() {
	// 示例1
	var contents string
	buffer1 := bytes.NewBufferString(contents)
	fmt.Println(buffer1.Len(), buffer1.Cap()) //0 32

	buffer1.WriteString("12345")
	fmt.Println(buffer1.Len(), buffer1.Cap()) //5 32

	buffer1.WriteString("67")
	fmt.Println(buffer1.Len(), buffer1.Cap()) //7 32
}
func test3() {
	// 示例1
	contents := "ab"
	buffer1 := bytes.NewBufferString(contents)
	fmt.Println(buffer1.Len(), buffer1.Cap()) //2 8

	unreadBytes := buffer1.Bytes()
	fmt.Println(unreadBytes) //[97 98]

	contents = "cdefg"
	buffer1.WriteString(contents)
	fmt.Println(buffer1.Len(), buffer1.Cap()) //7 8

	// 只要扩充一下之前拿到的未读字节切片unreadBytes, 就可以用它来读取甚至修改buffer中的后续内容。
	unreadBytes = unreadBytes[:cap(unreadBytes)]
	fmt.Println(unreadBytes) //[97 98 99 100 101 102 103 0]

	value := byte('X')
	unreadBytes[len(unreadBytes)-2] = value
	fmt.Println(buffer1.Bytes()) //[97 98 99 100 101 102 88]

	// 不过，在buffer的内容容器真正扩容之后就无法这么做了
	contents = "hijklmn"
	buffer1.WriteString(contents)
	fmt.Println(buffer1.Len(), buffer1.Cap()) //14 16

	unreadBytes = unreadBytes[:cap(unreadBytes)]
	fmt.Println(unreadBytes) //[97 98 99 100 101 102 88 0]
	println()

	// 示例2
	// Next方法返回的后续字节切片也存在相同的问题。
	contents = "12"
	buffer2 := bytes.NewBufferString(contents)
	nextBytes := buffer2.Next(2)
	fmt.Println(nextBytes) //[49 50]

	contents = "34567"
	buffer2.WriteString(contents)
	fmt.Println(buffer2.Cap()) //8

	// 只要扩充一下之前拿到的后续字节切片nextBytes，就可以用它来读取甚至修改buffer中的后续内容。
	nextBytes = nextBytes[:cap(nextBytes)]
	fmt.Println(nextBytes) //[49 50 51 52 53 54 55 0]

	value = byte('X')
	nextBytes[len(nextBytes)-2] = value
	fmt.Println(buffer2.Bytes()) //[51 52 53 54 88]

	// 不过，在buffer的内容容器真正扩容之后就无法这么做了。
	contents = "89101112"
	buffer2.WriteString(contents)
	fmt.Println(buffer2.Cap()) //16

	nextBytes = nextBytes[:cap(nextBytes)]
	fmt.Println(nextBytes) //[49 50 51 52 53 54 88 0]
}

func main() {
	test1()
	println()
	test2()
	println()
	test3()
}
